package cl.gob.minvu.catastromobile.dao;

import java.util.ArrayList;
import java.util.List;

import cl.gob.minvu.catastromobile.to.FichaTO;
import cl.gob.minvu.catastromobile.util.Logger;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * @author psep
 * 
 */
public class FichaDAO {

	private static final Logger logger = Logger.getLogger(FichaDAO.class);

	private DatabaseHelper dataHelper;
	private SQLiteDatabase db;

	public static String[] FIELDS_FICHA = { "idFicha", "object", "jefeHogar",
			"estado", "photo1" };
	public static String TABLE_FICHA = "Ficha";

	/**
	 * @param context
	 */
	public FichaDAO(Context context) {
		this.dataHelper = new DatabaseHelper(context);
	}

	/**
	 * 
	 */
	public void open() {
		this.db = this.dataHelper.getWritableDatabase();
	}

	/**
	 * 
	 */
	public void close() {
		this.db.close();
	}

	@Override
	public void finalize() {
		this.dataHelper.close();
	}

	/**
	 * @param fichaTO
	 * @return
	 */
	public boolean insert(FichaTO fichaTO) {
		boolean result = false;
		this.open();

		try {
			ContentValues content = new ContentValues();
			content.put(FIELDS_FICHA[1], fichaTO.getFicha());
			content.put(FIELDS_FICHA[2], fichaTO.getNombreJefeHogar());
			// 1 = pendiente, 2 = sync, 3 rechazado
			content.put(FIELDS_FICHA[3], 1);
			content.put(FIELDS_FICHA[4], fichaTO.getPhoto1());

			this.db.insert(TABLE_FICHA, null, content);

			result = true;
		} catch (Exception e) {
			logger.error(e.getMessage());
		} finally {
			this.close();
		}

		return result;
	}
	
	/**
	 * @param id
	 * @return
	 */
	public boolean updateSync(int id) {
		return this.update(id, 2);
	}
	
	/**
	 * @param id
	 * @param estado
	 * @return
	 */
	private boolean update(int id, int estado) {
		boolean result = false;
		this.open();

		try {
			ContentValues content = new ContentValues();
			content.put(FIELDS_FICHA[3], estado);

			this.db.update(TABLE_FICHA, content, FIELDS_FICHA[0] + "=" + id, null);

			result = true;
		} catch (Exception e) {
			logger.error(e.getMessage());
		} finally {
			this.close();
		}

		return result;
	}
	
	/**
	 * @return
	 */
	public List<FichaTO> getAllBySync(){
		String[] params = {"1"};
		return this.get(params, FIELDS_FICHA[3] + "=?");
	}

	/**
	 * @return
	 */
	public List<FichaTO> getAll(){
		return this.get(null, null);
	}

	/**
	 * @return
	 */
	private List<FichaTO> get(String[] params, String where) {
		List<FichaTO> fichas = new ArrayList<FichaTO>();
		this.open();

		Cursor c = this.db.query(TABLE_FICHA, FIELDS_FICHA, where, params,
				null, null, FIELDS_FICHA[0] + " DESC");

		while (c.moveToNext()) {
			FichaTO ficha = new FichaTO();
			ficha.setId(c.getInt(0));
			ficha.setFicha(c.getString(1));
			ficha.setNombreJefeHogar(c.getString(2));
			ficha.setEstado(c.getInt(3));
			ficha.setPhoto1(c.getString(4));
			fichas.add(ficha);
		}

		c.close();
		this.close();

		return fichas;
	}

}
